/**
 * 防御塔基础信息
 */
export interface TowerInfo {
    /**
     * 防御塔 id
     */
    id: string
    /**
     * 防御塔 x 坐标
     */
    x: number
    /**
     * 防御塔 y 坐标
     */
    y: number
    /**
     * 防御塔是否工作，即`能量 > 10 && isActive`
     */
    work: boolean
    /**
     * 防御塔的强化倍率
     */
    effect: number
}

declare global {
    interface FlagMemory {
        /**
         * 成员
         */
        creeps: string[]
        /**
         * 成员配置名，类型为：ScreepsConfig.battleConfig
         * @see /src/settings.ts#BattleConfig
         */
        config: string
        /**
         * 小队状态，flee 逃跑，attack 攻击，sleep 休眠，默认为 attack
         */
        status?: 'attack' | 'flee' | 'avoid' | 'sleep'
        /**
         * 是否集合完毕
         */
        isGathered?: boolean
        /**
         * 移动模式
         */
        moveMode?: FlagMemory['status']
        /**
         * 小队队形
         */
        formation?: 'line' | 'square'
        /**
         * 上次的移动数据
         */
        lastMoveData?: {
            /**
             * 上次移动的方向
             */
            direction?: DirectionConstant
        }
        /**
         * 组队四人小队时间
         */
        formSquareTime?: number
        /**
         * 上次避让的时间
         */
        lastAvoidTime?: number
        /**
         * 虚拟伤害，用于调试
         */
        _virtual_damage?: number
        /**
         * 小队中是否有 work，有 work 则不会以爬为目标
         * TODO；有 bug，同时带了 work 和 rangedAttack 的爬则不会攻击 creep
         */
        hasWork?: boolean
        /**
         * 寻路过道优先
         */
        preferHighway?: boolean
        /**
         * spawn 周围是否危险，危险则不可通行
         */
        isSpawnDanger?: boolean
        /**
         * 低于多少血量的建筑视为可以通行
         */
        structHitLimit?: number
        /**
         * 专注打建筑
         */
        forceStructure?: boolean
        /**
         * 优先打爬
         */
        preferCreep?: boolean
        /**
         * rush 模式，不算伤
         */
        rush?: boolean
    }

    interface RoomMemory {
        /**
         * 防御塔基础信息，用于构造塔伤分布图
         */
        towerInfos?: TowerInfo[]
    }

    interface CreepMemory {
        /**
         * 上次的位置的字符串
         */
        lastPosStr?: string
    }

    interface Game {
        /**
         * 房间 CostMatrix 缓存
         */
        _username_costs?: { [username: string]: CostMatrix }
    }

    interface Flag {
        /**
         * 正在攻击的目标
         */
        _attackTargets?: (Creep | Structure)[]
        /**
         * 目标
         */
        _targets?: (Creep | Structure | Flag)[]
        /**
         * 小队能承受的最大伤害
         */
        _max_damage?: number
        /**
         * 需要避让的物体
         */
        _avoidObjs?: { pos: RoomPosition; range: number }[]
        /**
         * 旗帜所在房间可以攻击的建筑
         */
        _attackable_structures?: Structure[]
        /**
         * 旗帜所在房间可以攻击的 creep
         */
        _attackable_creeps?: Creep[]
        /**
         * 小队中是否有爬在房间边缘
         */
        _hasOnEdge?: boolean
    }

    interface Creep {
        /**
         * 虚拟血量
         */
        _virtual_hits?: number
        /**
         * 周围带蓝球的敌人
         */
        _ra_enemys?: Creep[]
        /**
         * 周围带蓝球或红球的敌人
         */
        _ra_atk_enemys?: Creep[]
        /**
         * rangedAttack 伤害
         */
        _ra_damage?: number
        /**
         * attack 伤害
         */
        _atk_damage?: number
        /**
         * 塔伤
         */
        _tower_damage?: number
        /**
         * 集火伤害
         */
        _fired_damage?: number
        /**
         * 当前 tick 需要的最大治疗量
         */
        _need_heal_power?: number
        /**
         * 第 2 tick 需要的最大治疗量
         */
        _need_heal_power_2t?: number
        /**
         * 当前 tick 具有的治疗量
         */
        _heal_power?: number
        /**
         * hold 住需要的治疗量
         */
        _hold_heal_power?: number
        /**
         * 移动过
         */
        _moved?: boolean
        /**
         * 需要的治疗量
         */
        _heal_need?: number
        /**
         * 破防伤害
         */
        _break_damage?: number
    }

    interface RoomObject {
        /**
         * 希望保持的范围
         */
        _range?: number
    }
}
